package com.smdp.controller;


import com.smdp.dto.Result;
import com.smdp.entity.Shop;
import com.smdp.service.IShopService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;


/**
 * 店铺管理前端控制器。
 * 包含新增、查询（根据商铺id、根据商铺类型、根据商铺类型+商铺距离、根据商铺名称）、更新商铺信息的功能。
 *
 * @author 蔡方珩
 */
@RestController
@RequestMapping("/shop")
public class ShopController {

    @Resource
    public IShopService shopService;

    /**
     * 根据id查询商铺信息。
     * 使用布隆过滤器和逻辑过期防止缓存击穿。
     * @param id 商铺id
     * @return 成功：商铺详情数据 / 失败：失败原因
     */
    @GetMapping("/{id}")
    public Result queryShopById(@PathVariable("id") Long id) {
        return shopService.queryById(id);
    }

    /**
     * 新增商铺信息。
     * 将商铺信息保存到布隆过滤器和缓存中。
     * @param shop 商铺数据
     * @return 成功：商铺id / 失败：失败原因
     */
    @PostMapping("/save")
    public Result saveShop(@RequestBody Shop shop) {
        return shopService.saveShop(shop);
    }

    /**
     * 更新商铺信息。
     * 如果更新成功则删除缓存信息，防止拿到旧的数据。
     * @param shop 商铺数据
     * @return 成功：ok / 失败：失败原因
     */
    @PutMapping("/update")
    public Result updateShop(@RequestBody Shop shop) {
        // 写入数据库
        return shopService.updateShop(shop);
    }

    /**
     * 根据商铺类型分页查询商铺信息，根据商铺距离进行排序
     * @param typeId 商铺类型
     * @param current 当前页码
     * @param x x坐标
     * @param y y坐标
     * @param d 查询距离
     * @return 成功：按距离查询的商铺列表 / 无位置信息：按类型分页查询商户 / 失败：空列表
     */
    @GetMapping("/of/type")
    public Result queryShopByType(
            @RequestParam("typeId") Integer typeId,
            @RequestParam(value = "current", defaultValue = "1") Integer current,
            @RequestParam(value = "x", required = false) Double x,
            @RequestParam(value = "y", required = false) Double y,
            @RequestParam(value = "distance", required = false) Double d
    ) {
        return shopService.queryShopByType(typeId, current, x, y, d);
    }

    /**
     * 根据商铺名称关键字分页查询商铺信息
     * @param name 商铺名称关键字
     * @param current 页码
     * @return 分页的商铺列表
     */
    @GetMapping("/of/name")
    public Result queryShopByName(
            @RequestParam(value = "name", required = false) String name,
            @RequestParam(value = "current", defaultValue = "1") Integer current
    ) {
        return shopService.queryShopByName(name, current);
    }
}
